﻿#include "msg_config.h"
#include <QtEndian>

Msg_Config::Msg_Config(QObject* parent)
	: Msg{ parent }
{
	Head0 = 0xFF;                         //固定头	7-0	uint8_t FF

	CmdID = 1;         //命令字	7-0	uint8_t	0			0:获取设备当前状态，1:修改并获取设备状态
	DeviceID = 0;               //2	节点id	7-0	uint8_t	0			0-23表示以太网节点，24-89表示can节点，90-155表示422节点        内容
	Mode = 0x01;             //3	节点	输出模式	7-0	uint8_t	0			0:不输出，1:固定值输出，2:正弦波，3:余弦波，4:方波
	Value = 1.0f;             //4-7	节点值	31-0	float				模式为0时表示输出值，其他模式时表示输出的峰值
	Frequency = 0.1f;             //8-11	节点频率	31-0		float	0			模式0时无效，其他模式时表示输出频率，单位Hz
	Phase = 1.0;        //12-15	节点相位偏移	31-0		float	0			模式0时无效，模式2或3时表示偏移相位的百分比，范围[0,1]，模式4时表示占空比

							   //校验	N-2,N-1	校验和	15-0	uint16 t	0
}

QByteArray Msg_Config::ToByte()
{
	msg_data.clear();

	msg_data.resize(18);

	msg_data[0] = Head0;
	msg_data[1] = CmdID;
	msg_data[2] = DeviceID;    //3	节点	输出模式	7-0	uint8_t	0			0:不输出，1:固定值输出，2:正弦波，3:余弦波，4:方波
	msg_data[3] = Mode;             //4-7	节点值	31-0	float				模式为0时表示输出值，其他模式时表示输出的峰值

	float tmp;
	qToBigEndian(Value, &tmp);
	memcpy(msg_data.data() + 4, &tmp, 4);

	qToBigEndian(Frequency, &tmp);
	memcpy(msg_data.data() + 8, &tmp, 4);

	qToBigEndian(Phase, &tmp);
	memcpy(msg_data.data() + 12, &tmp, 4);

	Checksum = 0;
	for (int i = 1; i < 16; i++)
		Checksum += (unsigned char)msg_data[i];

	memcpy(msg_data.data() + 16, &Checksum, 2);

	QString info_hex = msg_data.toHex('-');

	//assert(msg_data.length() == 18);

	return msg_data;
}
